#pragma once

#include "RungeKutta.h"

/**
 * @file MOL.h
 * @author xingyifan
 * @date 2022-07-28 14:35
 *
 * @description: MOL 配合 Runge-Kutta 方法求解偏微分方程组
 */

class MOL
{
public:
    /**
     * @file MOL.h
     * @author xingyifan
     * @date 2022-07-28 14:36
     *
     * @description: 常规方法 U'(t) = AU(t) + g(t)
     */

    Real solve(Matrix &A, TimeGrid &G, Func g, ESDIRK *Z)
    {
        // 计算步数
        int N = G.size();

        // 指针位置
        Gtimer U = G.begin();

        // 开始计时
        clock_t start = clock();

        // 循环计算每一步，N 个节点，移动 N-1 次
        for (int i = 1; i < N; i++)
        {
            U = Z->shift(A, g, U);
        }

        // 结束计时
        Real t = Real(clock() - start) / CLOCKS_PER_SEC;

        return t;
    }
};